#include <iostream>
#include <fstream>
#include <algorithm>
#include <string>
#include <map>
#include <vector>

using namespace std;

typedef map<string, int> word_count_list;

struct val_lessthan : binary_function < pair<string, int>, pair<string, int>, bool >
{
	bool operator() (const pair<string, int>& x, const pair<string, int>& y) const
	{
		return x.second<y.second;
	}
}val_lt;

int main()
{
	word_count_list word_count;
	string filename;

	// Get the filename.
	cout << "Enter the file you wish to have searched:\n";
	cin >> filename;

	// Open file.
	ifstream file(filename.c_str());

	// Read in all the words.
	string word;

	while (file >> word){
		// Remove punctuation.
		int index;
		while ((index = word.find_first_of(".,!?\\;-*+")) != string::npos)
			word.erase(index, 1);

		++word_count[word];
	}

	//copy pairs to vector
	vector<pair<string, int> > wordvector;
	copy(word_count.begin(), word_count.end(), back_inserter(wordvector));

	//sort the vector by second (value) instead of key
	sort(wordvector.begin(), wordvector.end(), val_lt);

	for (int i = 0; i<wordvector.size(); ++i)
		cout << wordvector[i].first << " = " << wordvector[i].second << endl;

	system("pause");
	return 0;
	
}

